package com.shujia.day02;

public class Demo06BitCompute {
    public static void main(String[] args) {
        /*
           TODO
                位运算符：
                << 左移  相当于对当前值乘以 2^N次方
                >> 右移动 相当于对当前值除以 2^N次方
                >>> 无符号右移
                & 与  | 或  =>  对应位置进行按照 与 或 逻辑进行比较 1为true 0为false
                ^ 异或
                ~ 反码

           TODO 计算逻辑
              对于位运算，根据如下顺序进行计算
                原码：就是二进制定点表示法，即最高位为符号位，“0”表示正，“1”表示负，其余位表示数值的大小。
                反码：正数的反码与其原码相同；负数的反码是对其原码逐位取反，但符号位除外
                补码：正数的补码与其原码相同；负数的补码是在其反码的末位加1
             ① 3 原码 反码 补码: 0 0000000 00000000 00000000 00000011
                 << 2 : 除去最高位 将其他位置数据左移两个   0 (\00\)00000 00000000 00000000 0000001100
             ②  12 >> 2
                    12 补码: 0 0000000 00000000 00000000 00001100
                   >> 2 除去最高位 将其他位置数据右移两个  0 00 0000000 00000000 00000000 000011(\00\)
             ③  -12 >>> 2
                   -12 原码  1 0000000 00000000 00000000 00001100
                       反码  1 1111111 11111111 11111111 11110011
                       补码  1 1111111 11111111 11111111 11110100
                 >>> 2 补码  (00)1 1111111 11111111 11111111 111101(\00\)
                       反码  0 011111111 11111111 11111111 111101
                       原码  0 011111111 11111111 11111111 111101
                 最终结果为 1073741821
             ④  3 & 4 与运算
                 3 补码: 0 0000000 00000000 00000000 00000011
                 4 补码: 0 0000000 00000000 00000000 00000100
               计算结果： 0 0000000 00000000 00000000 00000000
             ⑤  3 | 4 或运算
                 3 补码: 0 0000000 00000000 00000000 00000011
                 4 补码: 0 0000000 00000000 00000000 00000100
              计算结果    0 0000000 00000000 00000000 00000111  => 7
             ⑥ 3 ^ 4
                ~3
                自行了解学习

         */
        System.out.println(3 << 2);  //12
        System.out.println(-3 << 2);  //-12
        System.out.println(12 >> 2); // 3
        System.out.println(-12 >> 2); //-3
        System.out.println(12 >>> 2); // 3
        System.out.println(-12 >>> 2); // 1073741821
        System.out.println(3 & 4); // 0  => 原码 反码 补码 使用补码进行数据计算 转换二进制后 0 表示false 1表示true 对应位置进行计算
        System.out.println(3 | 4); // 7
        System.out.println(3 ^ 4); // 7
        System.out.println(~3); // -4




    }
}
